// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#ifndef LIBGO_GO_STRING_H
#define LIBGO_GO_STRING_H

static inline _Bool
__go_strings_equal(struct __go_string s1, struct __go_string s2)
{
	return (s1.__length == s2.__length && __builtin_memcmp(s1.__data, s2.__data, s1.__length) == 0);
}

static inline _Bool
__go_ptr_strings_equal (const struct __go_string *ps1, const struct __go_string *ps2)
{
	if (ps1 == NULL)
		return ps2 == NULL;
	if (ps2 == NULL)
		return 0;
	return __go_strings_equal (*ps1, *ps2);
}

extern int __go_get_rune(const unsigned char *, uintptr, int *);

int __go_strcmp(struct __go_string s1, struct __go_string s2);


extern struct __go_open_array __go_string_to_byte_array(struct __go_string str);
extern struct __go_string     __go_byte_array_to_string(const void* p, int len);

extern struct __go_open_array __go_string_to_int_array(struct __go_string str);
extern struct __go_string     __go_int_array_to_string(const void* p, int len);

extern struct __go_string     __go_int_to_string(int v);

extern struct __go_string     __go_string_plus(struct __go_string s1, struct __go_string s2);

struct __go_string     __go_string_slice(struct __go_string s, int start, int end);


// C called.

int32	runtime_findnull(const byte*);
String	runtime_gostringnocopy(const byte*);

#endif /* !defined(LIBGO_GO_STRING_H) */
